package com.slink.fxfk.common.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Set;

import org.springframework.orm.hibernate4.HibernateTemplate;

/**
 * 单表操作Dao
 * 
 * @author 新
 * 
 */
public interface CommonDao
{
	/**
	 * 根据主键查找实体对象
	 * 
	 * @param entityClass
	 *            实体类类
	 * @param id
	 *            主键
	 * @return 实体对象或null
	 */
	public <T> T get(Class<T> entityClass, Serializable id);
	
	/**
	 * 示例查询单个对象
	 * @param exampleEntity
	 * @return
	 */
	public <T> T uniqueByExample(T exampleEntity);

	/**
	 * 根据主键查找带部分属性的实体对象
	 * 
	 * @param entityClass
	 *            实体类类
	 * @param id
	 *            主键
	 * @param idProperty
	 *            主键对应的property，null代表property 为id
	 * @param properties
	 *            要返回的property集合
	 * @return 带部分属性的实体对象或null
	 */
	public <T> T getSection(Class<T> entityClass, Serializable id,
			String idProperty, Set<String> properties);

	/**
	 * 保存对象(全部属性保存)
	 * 
	 * @param entity
	 *            实体对象
	 * @return
	 */
	public Serializable save(Object entity);

	/**
	 * 保存对象（非null属性保存）
	 * 
	 * @param entity
	 * @return
	 */
	public int saveSection(Object entity);

	/**
	 * 保存或更新实体(数据库中有此ID为全部属性更新，否则为全部属性保存)
	 * 
	 * @param entity
	 *            实体对象
	 */
	public void saveOrUpdate(Object entity);

	/**
	 * 保存或更新实体(数据库中有此ID为非空属性更新，否则为非空属性保存)
	 * @param entity
	 */
	public void saveOrUpdateSection(Object entity);

	/**
	 * 根据主键更新实体(全部属性的更新)
	 * 
	 * @param entity
	 */
	public void update(Object entity);

	/**
	 * 根据主键更新实体(非空属性更新)
	 * 
	 * @param entity
	 */
	public int updateSection(Object entity);

	/**
	 * 根据非空属性条件删除
	 * @param entity
	 * @return
	 */
	public int deleteSection(Object entity);

	/**
	 * 示例查询
	 * @param exampleEntity
	 * @return
	 */
	public <T> List<T> findByExample(T exampleEntity);

	/**
	 * 示例查询记录数
	 * @param exampleEntity
	 * @return
	 */
	public <T> long getCountByExample(T exampleEntity);

	/**
	 * 示例分页列表记录
	 * @param exampleEntity
	 * @param pageNo 从1开始
	 * @param pageSize 大于0
	 * @return
	 */
	public <T> List<T> listByExample(T exampleEntity, int pageNo, int pageSize);
	
	/**
	 * 获取hibernateTemplate
	 * @return
	 */
	public HibernateTemplate getHibernateTemplate();
}
